package karaokestrong.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import karaokestrong.excepcion.DAOExcepcion;
import karaokestrong.modelo.Producto;
import karaokestrong.modelo.TipoProducto;
import karaokestrong.util.ConexionBD;

public class ProductoDAO extends BaseDAO{

public Producto insertar(Producto vo) throws DAOExcepcion {
		
		System.out.println("ProuctoDAO: insertar(Producto vo)");
		String query = "INSERT INTO producto(nombre,precio,elog,disponible,idtipoproducto) VALUES (?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			
			stmt.setString(1, vo.getNombreProducto());
			stmt.setDouble(2, vo.getPrecioProducto());
			stmt.setBoolean(3, vo.isElogProducto());
			stmt.setBoolean(4, vo.isDisponibleProducto());
			stmt.setInt(5, vo.getIdTipoProducto());
			System.out.println("Registro Exitoso");
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			
			// Obtener el ultimo id
			int id = 0;
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setIdProducto(id);
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}


public Collection<TipoProducto> listarProducto() throws DAOExcepcion {
	String query = "select * from  tipoproducto";


	Collection<TipoProducto> c = new ArrayList<TipoProducto>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		while (rs.next()) {
			TipoProducto vo = new TipoProducto();
			
			vo.setIdTipoProducto(rs.getInt("idtipoproducto"));
			vo.setNombreTipoProducto(rs.getString("nombre"));

			c.add(vo);

		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return c;
}



public Collection<Producto> listarProducto2() throws DAOExcepcion {
	String query = "select * from  producto";


	Collection<Producto> c = new ArrayList<Producto>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		while (rs.next()) {
			Producto vo = new Producto();
			
			vo.setIdProducto(rs.getInt("idproducto"));
			vo.setNombreProducto(rs.getString("nombre"));
			vo.setPrecioProducto(rs.getDouble("precio"));
			vo.setElogProducto(rs.getBoolean("elog"));
			vo.setDisponibleProducto(rs.getBoolean("disponible"));
			vo.setIdTipoProducto(rs.getInt("idtipoproducto"));	

			c.add(vo);

		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return c;
}




public Collection<Producto> buscarPorNombre(String nombre) throws DAOExcepcion {
	String query = "select idproducto, nombre, precio, elog, disponible,idtipoproducto from producto where nombre like ? and elog = false";
	Collection<Producto> lista = new ArrayList<Producto>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, "%" + nombre + "%");
		rs = stmt.executeQuery();
		while (rs.next()) {
			Producto vo = new Producto();
			
			vo.setIdProducto(rs.getInt("idproducto"));
			vo.setNombreProducto(rs.getString("nombre"));
			vo.setPrecioProducto(rs.getDouble("precio"));
			vo.setElogProducto(rs.getBoolean("elog"));
			vo.setDisponibleProducto(rs.getBoolean("disponible"));
			vo.setIdTipoProducto(rs.getInt("idtipoproducto"));			
			lista.add(vo);
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	System.out.println(lista.size());
	return lista;
}

public Producto actualizar(Producto vo) throws DAOExcepcion {
	String query = "update producto set nombre=?,precio=?,elog=?,disponible=?,idtipoproducto=? where idproducto=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		
		stmt.setString(1, vo.getNombreProducto());
		stmt.setDouble(2, vo.getPrecioProducto());
		stmt.setBoolean(3, vo.isDisponibleProducto());
		stmt.setBoolean(4, vo.isElogProducto());
		stmt.setInt(5, vo.getIdTipoProducto());
		stmt.setInt(6, vo.getIdProducto());
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo actualizar el producto");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}


public Producto eliminar(Producto vo) throws DAOExcepcion {
	String query = "update producto set elog= true where idproducto=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		//stmt.setBoolean(1, vo.isElog());
		stmt.setInt(1, vo.getIdProducto());
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo anular producto");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}
	
}
